Terminal services provide techniques for allowing access to applications and data stored on a server. User input is sent over a network to the server and audio and graphics are sent from the server to the client. Over the years different techniques have been developed to remote graphics such as command level remoting and bitmap level remoting.
Bitmap level remoting is generally considered to be the easier of the two techniques to implement. In bitmap remoting, the graphics processing is performed on the terminal server and the final image, e.g., an array of pixel values that forms a bitmap, is compressed and sent over the network to the client. This technique requires a server that has enough computational power to render images for one or more clients.
Command level remoting on the other hand offloads the graphics rendering to the client. Primitives, e.g., vertices that can be processed by a driver and executed by a graphics processor, can be captured and sent to the client. This reduces the processing power required to remote graphics. However, more bandwidth is needed to send data representing 3D graphics, such as those of a videogame or user interface, than bitmaps.
Those having skill in the art thus far have attempted to perform command level remoting by capturing commands that generate primitives, e.g., vertices, and constants, output by application program interfaces. Generally, as different types of applications were developed over the years, e.g., new user interfaces that use 3D hardware, videogames, etc., the trend has been to capture the commands output by each application using custom remoting components optimized to capture specific API constructs output by specific APIs. This has lead to an architecture where the capture of data occurs at a multitude of places in the computer and this architecture requires an system that is becoming increasingly complex. Also, as commands from more and more applications are remoted it has become difficult to synchronize the rendering operations across different remoting components. For example, a GUI box may be generated using one technique and the text that populates icons may be drawn with another. If the commands are not synchronized the text may appear in the wrong portion of the GUI box or at the wrong time. Accordingly, techniques for synchronizing commands are desirable.